home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
SGI Developer Toolbox 6.1
/
SGI Developer Toolbox 6.1 - Disc 4.iso
/
src
/
haeberli
/
libgutil
/
glshapes.c
< prev
next >
Wrap
C/C++ Source or Header
|
1994-08-01
|
7KB
|
348 lines
/*
* Copyright 1991, 1992, 1993, 1994, Silicon Graphics, Inc.
* All Rights Reserved.
*
* This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, Inc.;
* the contents of this file may not be disclosed to third parties, copied or
* duplicated in any form, in whole or in part, without the prior written
* permission of Silicon Graphics, Inc.
*
* RESTRICTED RIGHTS LEGEND:
* Use, duplication or disclosure by the Government is subject to restrictions
* as set forth in subdivision (c)(1)(ii) of the Rights in Technical Data
* and Computer Software clause at DFARS 252.227-7013, and/or in similar or
* successor clauses in the FAR, DOD or NASA FAR Supplement. Unpublished -
* rights reserved under the Copyright Laws of the United States.
*/
#include "gl.h"
#include "port.h"
#include "values.h"
#include "math.h"
#include "glmode.h"
#define A (-0.5)
#define B ( 0.5)
#define SIN(n) sin( ((n)*2*M_PI)/nsides )
#define COS(n) cos( ((n)*2*M_PI)/nsides )
#define sphereX(x,y) (0.5 * SIN(x) * SIN(y))
#define sphereY(x,y) (0.5 * COS(x) * SIN(y))
#define sphereZ(x,y) (0.5 * COS(y))
#define CONESIDES 20
#define CYLINDERSIDES 20
#define SPHERESIDES 20
static circsides = 20;
glcircle(x,y,rad)
float x, y, rad;
{
int i, parity;
float angle, step;
parity = (rad>0.0);
angle = 0.0;
step = (2.0*3.1415926535)/circsides;
glbeginfacet();
if(parity) {
glnormal(0.0,0.0,1.0);
for(i=circsides; i>0; i--) {
glvertex(x+rad*sin(angle),y+rad*cos(angle),0.0);
angle += step;
}
} else {
rad = -rad;
glnormal(0.0,0.0,-1.0);
for(i=circsides; i>0; i--) {
glvertex(x+rad*sin(angle),y+rad*cos(angle),0.0);
angle -= step;
}
}
glendfacet();
}
static cubeside()
{
glbeginfacet();
glnormal(0.0,0.0,1.0);
glvertex(-0.5,-0.5,0.5);
glvertex( 0.5,-0.5,0.5);
glvertex( 0.5, 0.5,0.5);
glvertex(-0.5, 0.5,0.5);
glendfacet();
}
glcube()
{
pushmatrix();
cubeside();
rot(90.0,'x');
cubeside();
rot(90.0,'x');
cubeside();
rot(90.0,'x');
cubeside();
rot(90.0,'y');
cubeside();
rot(180.0,'y');
cubeside();
popmatrix();
}
glrectoid(x1,x2,y1,y2,z1,z2)
float x1,x2,y1,y2,z1,z2;
{
float xmin, xmax;
float ymin, ymax;
float zmin, zmax;
xmin = MIN(x1,x2);
xmax = MAX(x1,x2);
ymin = MIN(y1,y2);
ymax = MAX(y1,y2);
zmin = MIN(z1,z2);
zmax = MAX(z1,z2);
pushmatrix();
translate((xmin+xmax)/2.0,(ymin+ymax)/2.0,(zmin+zmax)/2.0);
scale(xmax-xmin,ymax-ymin,zmax-zmin);
glcube();
popmatrix();
}
gltetrahedron(argc,argv)
{
glbeginfacet();
glvertex(A,B,A);
glvertex(B,A,A);
glvertex(A,A,B);
glendfacet();
glbeginfacet();
glvertex(B,A,A);
glvertex(B,B,B);
glvertex(A,A,B);
glendfacet();
glbeginfacet();
glvertex(B,A,A);
glvertex(A,B,A);
glvertex(B,B,B);
glendfacet();
glbeginfacet();
glvertex(B,B,B);
glvertex(A,B,A);
glvertex(A,A,B);
glendfacet();
}
glcone()
{
int i, n;
int nsides = CONESIDES;
glbeginfacet();
for(i=0; i<nsides; i++)
glvertex(0.5*SIN(i),0.5*COS(i),-0.5);
glendfacet();
for(i=0; i<nsides; i++) {
n = i+1;
if(n == nsides)
n = 0;
glbeginfacet();
glvertex(0.0,0.0,0.5);
glvertex(0.5*SIN(n),0.5*COS(n), -0.5);
glvertex(0.5*SIN(i),0.5*COS(i), -0.5);
glendfacet();
}
}
glcylinder()
{
int i, n;
int nsides = CYLINDERSIDES;
float si, sn, ci, cn;
glbeginfacet();
glnormal(0.0,0.0,-1.0);
for(i=0; i<nsides; i++)
glvertex(0.5*SIN(i),0.5*COS(i),-0.5);
glendfacet();
glbeginfacet();
glnormal(0.0,0.0,1.0);
for(i=nsides; i--;)
glvertex(0.5*SIN(i),0.5*COS(i),0.5);
glendfacet();
for(i=0; i<nsides; i++) {
n = i+1;
if(n == nsides)
n = 0;
glbeginfacet();
si = 0.5*SIN(i);
ci = 0.5*COS(i);
sn = 0.5*SIN(n);
cn = 0.5*COS(n);
glnormal(2*si,2*ci,0.0);
glvertex(si,ci,-0.5);
glvertex(si,ci,0.5);
glnormal(2*sn,2*cn,0.0);
glvertex(sn,cn,0.5);
glvertex(sn,cn,-0.5);
glendfacet();
}
}
glsphere()
{
int i, n;
int x, y;
int nx, ny;
int nsides, ysides;
nsides = SPHERESIDES;
ysides = nsides/2;
for(x=0; x<nsides; x++) {
nx = x+1;
if(nx == nsides)
nx = 0;
for(y=0; y<ysides; y++) {
ny = y+1;
if(y==0) {
glbeginfacet();
glvertex(sphereX(nx,ny),sphereY(nx,ny),sphereZ(nx,ny));
glvertex(sphereX( x,ny),sphereY( x,ny),sphereZ( x,ny));
glvertex(sphereX( x, y),sphereY( x, y),sphereZ( x, y));
glendfacet();
} else if(ny==ysides) {
glbeginfacet();
glvertex(sphereX(nx, y),sphereY(nx, y),sphereZ(nx, y));
glvertex(sphereX(nx,ny),sphereY(nx,ny),sphereZ(nx,ny));
glvertex(sphereX( x, y),sphereY( x, y),sphereZ( x, y));
glendfacet();
} else {
glbeginfacet();
glvertex(sphereX(nx, y),sphereY(nx, y),sphereZ(nx, y));
glvertex(sphereX(nx,ny),sphereY(nx,ny),sphereZ(nx,ny));
glvertex(sphereX( x,ny),sphereY( x,ny),sphereZ( x,ny));
glvertex(sphereX( x, y),sphereY( x, y),sphereZ( x, y));
glendfacet();
}
}
}
}
static int mypolymode = 1;
glbeginfacet()
{
if(mypolymode)
bgnpolygon();
else
bgnclosedline();
}
glendfacet()
{
if(mypolymode)
endpolygon();
else
endclosedline();
}
setpolymode(v)
int v;
{
mypolymode = v;
}
glvertex(x,y,z)
float x, y, z;
{
float v[3];
v[0] = x;
v[1] = y;
v[2] = z;
v3f(v);
}
glnormal(x,y,z)
float x, y, z;
{
float n[3];
n[0] = x;
n[1] = y;
n[2] = z;
n3f(n);
}
static int firsted, modechange, glmode;
static int frameno;
glsetmode(cmode,val)
int cmode, val;
{
if(!firsted) {
matinit();
firsted = 1;
}
if(val)
glmode |= cmode;
else
glmode &= ~cmode;
modechange = 1;
}
glgetmode()
{
return glmode;
}
glbeginframe()
{
if(modechange) {
if(glmode & ZBUFFER)
zbuffer(1);
else
zbuffer(0);
if(glmode & DOUBLEBUFFER)
doublebuffer();
else
singlebuffer();
if(glmode & RGB)
RGBmode();
else
cmode();
if(glmode & BACKFACE)
backface(1);
else
backface(0);
if(glmode & FATPOLYGONS)
glcompat(GLC_OLDPOLYGON,1);
else
glcompat(GLC_OLDPOLYGON,0);
gconfig();
modechange = 0;
}
if(glmode & ZBUFFER) {
zclear();
setpattern(getpattern()); /* fix GT bug */
}
if(frameno != 0 && (glmode & FADE))
nextdither();
}
glendframe()
{
if((glmode & DOUBLEBUFFER) && (!(glmode & INHIBITSWAP)))
swapbuffers();
frameno++;
}